#include "gpio_led.h"
#include "delay_hal.h"

//#define LED_TEST

#ifdef LED_TEST
static void led_delay(void)
{
	int i = 0;
	for(i=0;i<0xfffff;i++);
}
static void led_gpio_test(void)
{
		while(1)
		{
			//led0_toggle();
			//led1_toggle();
			led2_toggle();
			led_delay();		
		}

}

#endif

/**
 * @brief LED 引脚初始化
 * 
 */
void led_gpio_init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_StructInit(&GPIO_InitStruct); //初始化结构体
  
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //GPIO输出模式
  GPIO_InitStruct.GPIO_Pin = LED0_GPIO_Pin;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(LED0_GPIO, &GPIO_InitStruct);
	
  GPIO_InitStruct.GPIO_Pin = LED1_GPIO_Pin;
  GPIO_Init(LED1_GPIO, &GPIO_InitStruct);
	GPIO_PinAFConfig(GPIO2, GPIO_PinSource_8, AF0_GPIO);
	
  GPIO_InitStruct.GPIO_Pin = LED2_GPIO_Pin;
  GPIO_Init(LED2_GPIO, &GPIO_InitStruct);
	GPIO_PinAFConfig(GPIO3, GPIO_PinSource_9, AF0_GPIO);

	led0_off();
	led1_off();
	led2_off();

#ifdef LED_TEST

	led_gpio_test();
#endif 
	
}
 			
void led0_on(void)
{
	GPIO_SetBits(LED0_GPIO,LED0_GPIO_Pin);
}
void led0_off(void)
{
	GPIO_ResetBits(LED0_GPIO,LED0_GPIO_Pin);
}
void led0_toggle(void)
{
	Invers_GPIO(LED0_GPIO,LED0_GPIO_Pin);	
}
uint8_t led0_pin_state(void)
{
	return GPIO_ReadOutputDataBit(LED0_GPIO,LED0_GPIO_Pin);
}

void led1_on(void)
{
	GPIO_SetBits(LED1_GPIO,LED1_GPIO_Pin);
}
void led1_off(void)
{
	GPIO_ResetBits(LED1_GPIO,LED1_GPIO_Pin);
}
void led1_toggle(void)
{
	Invers_GPIO(LED1_GPIO,LED1_GPIO_Pin);	
}
uint8_t led1_pin_state(void)
{
	return GPIO_ReadOutputDataBit(LED1_GPIO,LED1_GPIO_Pin);
}
void led2_on(void)
{
	GPIO_SetBits(LED2_GPIO,LED2_GPIO_Pin);
}
void led2_off(void)
{
	GPIO_ResetBits(LED2_GPIO,LED2_GPIO_Pin);
}
void led2_toggle(void)
{
	Invers_GPIO(LED2_GPIO,LED2_GPIO_Pin);	
}
uint8_t led2_pin_state(void)
{
	return GPIO_ReadOutputDataBit(LED2_GPIO,LED2_GPIO_Pin);
}
       
/**
 * @brief led 开关
 * 
 * @param num led 编号 0~2
 * @param val 开关值 1 开启 0 关闭
 */
void led_set(uint8_t num,uint8_t val)
{
	switch(num)
	{
		case 0:
				if(val)
				{
						led0_on();
				}
				else{
						led0_off();
				}
		break;
		case 1:
				if(val)
				{
						led1_on();
				}
				else{
						led1_off();
				}
		break;
		case 2:
				if(val)
				{
						led2_on();
				}
				else{
						led2_off();
				}
		break;
		default:
		break;
	}
}
uint8_t Invers_GPIO(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) //GPIO电平翻转函数
{
	u16 reg;
	reg = GPIO_ReadOutputDataBit(GPIOx, GPIO_Pin); //读GPIO电平
	if (reg)
	{
		GPIO_ResetBits(GPIOx, GPIO_Pin);
		return 0;
	}
	else
	{
		GPIO_SetBits(GPIOx, GPIO_Pin);
		return 1;
	}
}




